﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UtilZ.Dotnet.Ex.ZLog;

namespace UtilZ.Dotnet.Ex.Communication.Net.Ftp
{
    /// <summary>
    /// 发送站点特殊命令到远端服务器
    /// Sends site specific commands to remote server.
    /// </summary>
    internal class FtpSITECommand : FtpCommandAbs
    {
        /***********************************************************************************************************
        * [SITE]（Site Parameters,站点参数）命令
        * 说明：服务器使用SITE提供了某些服务特性，这些服务特性在系统中对文件传达而言是必要的，但又不是足够通用的可以包括到协议中作为命令的那些服务特性。这些服务的本质和他们的语法规范可以陈述在对HELPSITE命令的应答中。
        * 
        * 用法：SITE<String><CRLF>
        * 参数：String可以是任何串参数。
        * 例子：
        * SendData "SITE chmod 646 mylifle.ziP" + “/r/n
        * 
        * 注释：举例来说，使用如下语法，你就可以使用SITE来改变一个文件的权限属性。
        * SITE CHMOD<Attribute><Filename>
        * 返回值如下（粗体表示成功）：
        * 200  命令成功。
        * 202  命令还没有被实现，在此站点上是多余的。
        * 214  帮助信息回复
        * 500  语法错误，无法识别命令。这其中包括命令行过长之类的错误。
        * 501  参数或变无中有语法错误。
        * 530  无法登录。
        * 
        ************************************************************************************************************/

        /***********************************************************************************************************
        * [HELP]（Help，帮助）命令
        * 说明：让服务器通过到客户的控制连接发送有关其实现状态的帮助信息。
        * 
        * 用法：HELP[<Topic>]<CRLF>
        * 参数：Topic是一个可选的命令，或是请求哪条命令有关文本的其他参数。
        * 例子：
        * SendData "HELP" + “/r/n
        * 
        * 注释：HELP可以带一个参数（例如任何命令的名称），以在响应中返回更具体的信息。应答为类型211或214。建议在输入USER命令前允许使用HELP命令。服务器可以使用这个应答来指定站点相关的参数，例如在对HELP SITE的响应中。
        * 返回值如下（粗体表示成功）：
        * 211  系统状态，或系统的帮助应答。
        * 214  帮助消息。
        * 
        * 描述如何使用服务器或某条不常用的具体命令的方法。这个应答只对用户有用，因为帮助消息没有标准的格式。
        * 421  服务不可用，关闭控制连接。
        * 
        * 如果某项服务获知自己即将关闭，会向有命令做出这个应答。
        * 500  语法错误，无法识别命令。这其中包括命令行过长之类的错误。
        * 501  参数或变元中有语法错误。
        * 502  命令还没有被实现。
        * 
        ************************************************************************************************************/


        public FtpSITECommand()
            : base()
        {

        }


        protected override string[] GetNames()
        {
            return new string[] { FtpCommands.SITE, FtpCommands.HELP };
        }



        protected override IFtpResponse PrimitiveExcute(FtpSession session, string command, string commandLine)
        {
            //Request: site help
            //Response: 214-The following SITE commands are recognized (* ==>'s unimplemented).
            //Response:     DIRSTYLE 
            //Response:     HELP 
            //Response: 214 HELP command successful.


            try
            {
                if (string.Equals(command, FtpCommands.HELP))
                {
                    this.ProcessHelp(session);
                    return null;
                }

                if (string.IsNullOrEmpty(commandLine))
                {
                    return new FtpCodeResponse(FtpStatusCodes.Code500, "The parameter cannot be empty.");
                }

                if (string.Equals(commandLine.Trim(), "help", StringComparison.OrdinalIgnoreCase))
                {
                    this.ProcessHelp(session);
                    return null;
                }

                return new FtpCodeResponse(FtpStatusCodes.Code202, "Command not implemented.");
            }
            catch (Exception ex)
            {
                return new FtpCodeResponse(FtpStatusCodes.Code451, ex.Message);
            }
        }

        private void ProcessHelp(FtpSession session)
        {
            //求抓包验证

            //不晓得是啥意思,先暂时这么写着
            session.Send(new FtpTextResponse("214-The following SITE commands are recognized (* ==>'s unimplemented)"));
            session.Send(new FtpCodeResponse(FtpStatusCodes.Code214, "DIRSTYLE"));
            session.Send(new FtpCodeResponse(FtpStatusCodes.Code214, "HELP"));
            session.Send(new FtpCodeResponse(FtpStatusCodes.Code214, "HELP command successful"));
        }
    }

}
